OSDN Git Service

#27621 言語間リンク取得時に<includeonly>, <noinclude>を考慮するよう修正,
[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 NUnit.Framework;
18
19     /// <summary>
20     /// <see cref="MediaWikiPreparser"/>のテストクラスです。
21     /// </summary>
22     [TestFixture]
23     class MediaWikiPreparserTest
24     {
25         #region 定数
26
27         /// <summary>
28         /// 複数のテストケースで使用するテストテキスト。
29         /// </summary>
30         /// <remarks>タグの大文字小文字は区別されないはずのため、意図的に混入させている。</remarks>
31         private static readonly string TestData = "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         #endregion
38
39         #region IParserインタフェーステストケース
40
41         // ※ 2012年2月現在、IParser, ITextParserの各メソッド実装は親クラス側で行われており、
42         //    改造部分はどこかでやればテストされるのでそれで割愛
43
44         /// <summary>
45         /// <see cref="IParser.Parse"/>メソッドテストトケース。
46         /// </summary>
47         [Test]
48         public void TestParse()
49         {
50             IElement element;
51             XmlElement xml;
52             using (MediaWikiPreparser parser = new MediaWikiPreparser())
53             {
54                 element = parser.Parse(TestData);
55             }
56
57             // 解析だけであればincludeonly等の処理は行われない、元の文字列が保持される
58             Assert.AreEqual(TestData, element.ToString());
59
60             // includeonly, noinclude, nowiki, コメントのみ特別な要素として認識する
61             Assert.IsInstanceOf(typeof(ListElement), element);
62             ListElement list = (ListElement)element;
63             Assert.AreEqual("This template is [[xxx]]<br />\r\n", list[0].ToString());
64             Assert.AreEqual("<noWiki><nowiki>sample</nowiki>", list[1].ToString());
65             Assert.AreEqual("</nowiki>\r\n", list[2].ToString());
66             Assert.AreEqual("<inclUdeonly><p>include text<nowiki><includeonly>sample</includeonly></nowiki></p></includeonly>", list[3].ToString());
67             Assert.AreEqual("\r\n", list[4].ToString());
68             Assert.AreEqual("<noInclude>[[ja:Template:sample/doc]]<!--noinclude only--></noinclude>", list[5].ToString());
69             Assert.AreEqual("\r\n", list[6].ToString());
70             Assert.AreEqual("<!-- <includeonly>include only comment</includeonly> -->", list[7].ToString());
71             Assert.AreEqual(8, list.Count);
72
73             // 各要素の確認
74             Assert.IsInstanceOf(typeof(TextElement), list[0]);
75
76             // nowikiとコメントは再帰的に解析されない
77             Assert.IsInstanceOf(typeof(XmlElement), list[1]);
78             xml = (XmlElement)list[1];
79             Assert.AreEqual("<nowiki>sample", xml[0].ToString());
80             Assert.IsInstanceOf(typeof(XmlTextElement), xml[0]);
81             Assert.IsInstanceOf(typeof(XmlCommentElement), list[7]);
82
83             // includeonly, noincludeは再帰的に処理
84             Assert.IsInstanceOf(typeof(XmlElement), list[3]);
85             xml = (XmlElement)list[3];
86             Assert.AreEqual("<p>include text", xml[0].ToString());
87             Assert.AreEqual("<nowiki><includeonly>sample</includeonly></nowiki>", xml[1].ToString());
88             Assert.IsInstanceOf(typeof(XmlElement), xml[1]);
89             Assert.AreEqual("</p>", xml[2].ToString());
90             Assert.AreEqual(3, xml.Count);
91
92             Assert.IsInstanceOf(typeof(XmlElement), list[5]);
93             xml = (XmlElement)list[5];
94             Assert.AreEqual("[[ja:Template:sample/doc]]", xml[0].ToString());
95             Assert.IsInstanceOf(typeof(TextElement), xml[0]);
96             Assert.AreEqual("<!--noinclude only-->", xml[1].ToString());
97             Assert.IsInstanceOf(typeof(XmlCommentElement), xml[1]);
98             Assert.AreEqual(2, xml.Count);
99         }
100
101         #endregion
102
103         #region 公開メソッドテストケース
104
105         /// <summary>
106         /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース。
107         /// </summary>
108         /// <remarks>
109         /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
110         /// </remarks>
111         [Test]
112         public void TestFilterByInclude()
113         {
114             IElement element;
115             ListElement list;
116             using (MediaWikiPreparser parser = new MediaWikiPreparser())
117             {
118                 element = parser.Parse(TestData);
119                 parser.FilterByInclude(ref element);
120             }
121
122             // includeonlyが展開され、noinclude, コメントが削除される
123             Assert.IsInstanceOf(typeof(ListElement), element);
124             list = (ListElement)element;
125             Assert.AreEqual("This template is [[xxx]]<br />\r\n", list[0].ToString());
126             Assert.AreEqual("<noWiki><nowiki>sample</nowiki>", list[1].ToString());
127             Assert.AreEqual("</nowiki>\r\n", list[2].ToString());
128             Assert.AreEqual("<p>include text<nowiki><includeonly>sample</includeonly></nowiki></p>", list[3].ToString());
129             Assert.AreEqual("\r\n", list[4].ToString());
130             Assert.AreEqual("\r\n", list[5].ToString());
131             Assert.AreEqual(6, list.Count);
132
133             // 各要素の確認
134             Assert.IsInstanceOf(typeof(TextElement), list[0]);
135             Assert.IsInstanceOf(typeof(XmlElement), list[1]);
136
137             // includeonlyはListElementに置き換わる
138             Assert.IsInstanceOf(typeof(ListElement), list[3]);
139             list = (ListElement)list[3];
140             Assert.AreEqual("<p>include text", list[0].ToString());
141             Assert.AreEqual("<nowiki><includeonly>sample</includeonly></nowiki>", list[1].ToString());
142             Assert.IsInstanceOf(typeof(XmlElement), list[1]);
143             Assert.AreEqual("</p>", list[2].ToString());
144             Assert.AreEqual(3, list.Count);
145         }
146
147         /// <summary>
148         /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース(null)。
149         /// </summary>
150         [Test]
151         [ExpectedException(typeof(ArgumentNullException))]
152         public void TestFilterByIncludeNull()
153         {
154             IElement element = null;
155             using (MediaWikiPreparser parser = new MediaWikiPreparser())
156             {
157                 parser.FilterByInclude(ref element);
158             }
159         }
160
161         /// <summary>
162         /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース。
163         /// </summary>
164         /// <remarks>
165         /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
166         /// </remarks>
167         [Test]
168         public void TestFilterByNoinclude()
169         {
170             IElement element;
171             ListElement list;
172             using (MediaWikiPreparser parser = new MediaWikiPreparser())
173             {
174                 element = parser.Parse(TestData);
175                 parser.FilterByNoinclude(ref element);
176             }
177
178             // noincludeが展開され、includeonly, コメントが削除される
179             Assert.IsInstanceOf(typeof(ListElement), element);
180             list = (ListElement)element;
181             Assert.AreEqual("This template is [[xxx]]<br />\r\n", list[0].ToString());
182             Assert.AreEqual("<noWiki><nowiki>sample</nowiki>", list[1].ToString());
183             Assert.AreEqual("</nowiki>\r\n", list[2].ToString());
184             Assert.AreEqual("\r\n", list[3].ToString());
185             Assert.AreEqual("[[ja:Template:sample/doc]]", list[4].ToString());
186             Assert.AreEqual("\r\n", list[5].ToString());
187             Assert.AreEqual(6, list.Count);
188
189             // 各要素の確認
190             Assert.IsInstanceOf(typeof(TextElement), list[0]);
191             Assert.IsInstanceOf(typeof(XmlElement), list[1]);
192
193             // noincludeはListElementに置き換わる
194             Assert.IsInstanceOf(typeof(ListElement), list[4]);
195             list = (ListElement)list[4];
196             Assert.AreEqual("[[ja:Template:sample/doc]]", list[0].ToString());
197             Assert.IsInstanceOf(typeof(TextElement), list[0]);
198             Assert.AreEqual(1, list.Count);
199         }
200
201         /// <summary>
202         /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース(null)。
203         /// </summary>
204         [Test]
205         [ExpectedException(typeof(ArgumentNullException))]
206         public void TestFilterByNoincludeNull()
207         {
208             IElement element = null;
209             using (MediaWikiPreparser parser = new MediaWikiPreparser())
210             {
211                 parser.FilterByNoinclude(ref element);
212             }
213         }
214
215         #endregion
216
217         #region 静的メソッドテストケース
218
219         /// <summary>
220         /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース。
221         /// </summary>
222         [Test]
223         public void TestPreprocessByInclude()
224         {
225             // Parse→FilterByIncludeした結果をToStringしたものが返る
226             Assert.AreEqual(
227                 "This template is [[xxx]]<br />\r\n<noWiki><nowiki>sample</nowiki></nowiki>\r\n"
228                 + "<p>include text<nowiki><includeonly>sample</includeonly></nowiki></p>\r\n\r\n",
229                 MediaWikiPreparser.PreprocessByInclude(TestData));
230             Assert.AreEqual(String.Empty, MediaWikiPreparser.PreprocessByInclude(String.Empty));
231         }
232
233         /// <summary>
234         /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース(null)。
235         /// </summary>
236         [Test]
237         [ExpectedException(typeof(ArgumentNullException))]
238         public void TestPreprocessByIncludeNull()
239         {
240             MediaWikiPreparser.PreprocessByInclude(null);
241         }
242
243         /// <summary>
244         /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース。
245         /// </summary>
246         [Test]
247         public void TestPreprocessByNoinclude()
248         {
249             // Parse→FilterByNoincludeした結果をToStringしたものが返る
250             Assert.AreEqual(
251                 "This template is [[xxx]]<br />\r\n<noWiki><nowiki>sample</nowiki></nowiki>\r\n\r\n"
252                 + "[[ja:Template:sample/doc]]\r\n",
253                 MediaWikiPreparser.PreprocessByNoinclude(TestData));
254             Assert.AreEqual(String.Empty, MediaWikiPreparser.PreprocessByNoinclude(String.Empty));
255         }
256
257         /// <summary>
258         /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース(null)。
259         /// </summary>
260         [Test]
261         [ExpectedException(typeof(ArgumentNullException))]
262         public void TestPreprocessByNoincludeNull()
263         {
264             MediaWikiPreparser.PreprocessByNoinclude(null);
265         }
266
267         #endregion
268     }
269 }