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 NUnit.Framework;
20 /// <see cref="MediaWikiPreparser"/>のテストクラスです。
23 class MediaWikiPreparserTest
28 /// 複数のテストケースで使用するテストテキスト。
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> -->";
39 #region IParserインタフェーステストケース
41 // ※ 2012年2月現在、IParser, ITextParserの各メソッド実装は親クラス側で行われており、
42 // 改造部分はどこかでやればテストされるのでそれで割愛
45 /// <see cref="IParser.Parse"/>メソッドテストトケース。
48 public void TestParse()
52 using (MediaWikiPreparser parser = new MediaWikiPreparser())
54 element = parser.Parse(TestData);
57 // 解析だけであればincludeonly等の処理は行われない、元の文字列が保持される
58 Assert.AreEqual(TestData, element.ToString());
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);
74 Assert.IsInstanceOf(typeof(TextElement), list[0]);
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]);
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);
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);
106 /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース。
109 /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
112 public void TestFilterByInclude()
116 using (MediaWikiPreparser parser = new MediaWikiPreparser())
118 element = parser.Parse(TestData);
119 parser.FilterByInclude(ref element);
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);
134 Assert.IsInstanceOf(typeof(TextElement), list[0]);
135 Assert.IsInstanceOf(typeof(XmlElement), list[1]);
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);
148 /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース(null)。
151 [ExpectedException(typeof(ArgumentNullException))]
152 public void TestFilterByIncludeNull()
154 IElement element = null;
155 using (MediaWikiPreparser parser = new MediaWikiPreparser())
157 parser.FilterByInclude(ref element);
162 /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース。
165 /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
168 public void TestFilterByNoinclude()
172 using (MediaWikiPreparser parser = new MediaWikiPreparser())
174 element = parser.Parse(TestData);
175 parser.FilterByNoinclude(ref element);
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);
190 Assert.IsInstanceOf(typeof(TextElement), list[0]);
191 Assert.IsInstanceOf(typeof(XmlElement), list[1]);
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);
202 /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース(null)。
205 [ExpectedException(typeof(ArgumentNullException))]
206 public void TestFilterByNoincludeNull()
208 IElement element = null;
209 using (MediaWikiPreparser parser = new MediaWikiPreparser())
211 parser.FilterByNoinclude(ref element);
220 /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース。
223 public void TestPreprocessByInclude()
225 // Parse→FilterByIncludeした結果をToStringしたものが返る
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));
234 /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース(null)。
237 [ExpectedException(typeof(ArgumentNullException))]
238 public void TestPreprocessByIncludeNull()
240 MediaWikiPreparser.PreprocessByInclude(null);
244 /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース。
247 public void TestPreprocessByNoinclude()
249 // Parse→FilterByNoincludeした結果をToStringしたものが返る
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));
258 /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース(null)。
261 [ExpectedException(typeof(ArgumentNullException))]
262 public void TestPreprocessByNoincludeNull()
264 MediaWikiPreparser.PreprocessByNoinclude(null);