1 // ================================================================================================
3 // XmlElementParserのテストクラスソース。</summary>
5 // <copyright file="XmlElementParserTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Parsers
14 using Microsoft.VisualStudio.TestTools.UnitTesting;
17 /// <see cref="XmlElementParser"/>のテストクラスです。
20 public class XmlElementParserTest
25 /// 前処理・後処理で毎回生成/解放される<see cref="XmlParser"/>。
27 private XmlParser xmlParser;
36 /// <remarks><see cref="XmlParser.Dispose"/>が必要な<see cref="XmlParser"/>の生成。</remarks>
40 this.xmlParser = new XmlParser();
46 /// <remarks><see cref="XmlParser.Dispose"/>が必要な<see cref="XmlParser"/>の解放。</remarks>
48 public void TearDown()
50 this.xmlParser.Dispose();
58 /// <see cref="XmlElementParser.Targets"/>プロパティテストケース。
61 public void TestTargets()
63 XmlElementParser parser = new XmlElementParser(this.xmlParser);
66 Assert.IsNotNull(parser.Targets);
67 Assert.AreEqual(0, parser.Targets.Count);
68 parser.Targets.Add("span");
69 Assert.AreEqual("span", parser.Targets[0]);
72 string[] targets = new string[] { "div", "p" };
73 parser.Targets = targets;
74 Assert.AreSame(targets, parser.Targets);
78 /// <see cref="XmlElementParser.Targets"/>プロパティテストケース(null)。
81 [ExpectedException(typeof(ArgumentNullException))]
82 public void TestTargetsNull()
84 new XmlElementParser(this.xmlParser).Targets = null;
89 #region インタフェース実装メソッドテストケース
92 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(実例)。
95 public void TestTryParse()
98 XmlElement xmlElement;
99 XmlElementParser parser = new XmlElementParser(this.xmlParser);
101 Assert.IsTrue(parser.TryParse("<h1>test</h1>", out element));
102 xmlElement = (XmlElement)element;
103 Assert.AreEqual("<h1>test</h1>", xmlElement.ToString());
104 Assert.AreEqual("h1", xmlElement.Name);
105 Assert.AreEqual(0, xmlElement.Attributes.Count);
107 Assert.IsTrue(parser.TryParse("<br /><br />test<br />", out element));
108 xmlElement = (XmlElement)element;
109 Assert.AreEqual("<br />", xmlElement.ToString());
110 Assert.AreEqual("br", xmlElement.Name);
111 Assert.AreEqual(0, xmlElement.Attributes.Count);
113 Assert.IsTrue(parser.TryParse("<div id=\"testid\" name=\"testname\"><!--<div id=\"indiv\">test</div>--></div><br />", out element));
114 xmlElement = (XmlElement)element;
115 Assert.AreEqual("<div id=\"testid\" name=\"testname\"><!--<div id=\"indiv\">test</div>--></div>", xmlElement.ToString());
116 Assert.AreEqual("div", xmlElement.Name);
117 Assert.AreEqual(2, xmlElement.Attributes.Count);
118 Assert.AreEqual("testid", xmlElement.Attributes["id"]);
119 Assert.AreEqual("testname", xmlElement.Attributes["name"]);
121 this.xmlParser.IsHtml = true;
122 Assert.IsTrue(parser.TryParse("<p>段落1<p>段落2", out element));
123 xmlElement = (XmlElement)element;
124 Assert.AreEqual("<p>", xmlElement.ToString());
125 Assert.AreEqual("p", xmlElement.Name);
126 Assert.AreEqual(0, xmlElement.Attributes.Count);
128 Assert.IsTrue(parser.TryParse("<input type=\"checkbox\" name=\"param\" value=\"test\" checked><label for=\"param\">チェック</label>", out element));
129 xmlElement = (XmlElement)element;
130 Assert.AreEqual("<input type=\"checkbox\" name=\"param\" value=\"test\" checked>", xmlElement.ToString());
131 Assert.AreEqual("input", xmlElement.Name);
132 Assert.AreEqual(4, xmlElement.Attributes.Count);
133 Assert.AreEqual("checkbox", xmlElement.Attributes["type"]);
134 Assert.AreEqual("param", xmlElement.Attributes["name"]);
135 Assert.AreEqual("test", xmlElement.Attributes["value"]);
136 Assert.AreEqual(string.Empty, xmlElement.Attributes["checked"]);
138 Assert.IsTrue(parser.TryParse("<div id=\"outer\">outertext<div id=\"inner\">innertext</div></div>", out element));
139 xmlElement = (XmlElement)element;
140 Assert.AreEqual("<div id=\"outer\">outertext<div id=\"inner\">innertext</div></div>", xmlElement.ToString());
141 Assert.AreEqual("div", xmlElement.Name);
142 Assert.AreEqual(1, xmlElement.Attributes.Count);
143 Assert.AreEqual("outer", xmlElement.Attributes["id"]);
147 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(基本形)。
150 public void TestTryParseNormal()
153 XmlElement xmlElement;
154 XmlElementParser parser = new XmlElementParser(this.xmlParser);
156 Assert.IsTrue(parser.TryParse("<testtag></testtag>", out element));
157 xmlElement = (XmlElement)element;
158 Assert.AreEqual("<testtag></testtag>", xmlElement.ToString());
159 Assert.AreEqual("testtag", xmlElement.Name);
160 Assert.AreEqual(0, xmlElement.Attributes.Count);
162 Assert.IsTrue(parser.TryParse("<testtag2>test value</testtag2>", out element));
163 xmlElement = (XmlElement)element;
164 Assert.AreEqual("<testtag2>test value</testtag2>", xmlElement.ToString());
165 Assert.AreEqual("testtag2", xmlElement.Name);
166 Assert.AreEqual(0, xmlElement.Attributes.Count);
168 Assert.IsTrue(parser.TryParse("<testtag3> test value2 </testtag3>testend", out element));
169 xmlElement = (XmlElement)element;
170 Assert.AreEqual("<testtag3> test value2 </testtag3>", xmlElement.ToString());
171 Assert.AreEqual("testtag3", xmlElement.Name);
172 Assert.AreEqual(0, xmlElement.Attributes.Count);
174 Assert.IsTrue(parser.TryParse("<testtag4 testattr=\"testvalue\"> test<!-- </testtag4> --> value3 </testtag4>testend", out element));
175 xmlElement = (XmlElement)element;
176 Assert.AreEqual("<testtag4 testattr=\"testvalue\"> test<!-- </testtag4> --> value3 </testtag4>", xmlElement.ToString());
177 Assert.AreEqual("testtag4", xmlElement.Name);
178 Assert.AreEqual(1, xmlElement.Attributes.Count);
179 Assert.AreEqual("testvalue", xmlElement.Attributes["testattr"]);
181 Assert.IsTrue(parser.TryParse("<testtag5 testattr2='testvalue2'>testbody</testtag5 >testend", out element));
182 xmlElement = (XmlElement)element;
183 Assert.IsInstanceOfType(xmlElement[0], typeof(XmlTextElement));
184 Assert.AreEqual("<testtag5 testattr2='testvalue2'>testbody</testtag5 >", xmlElement.ToString());
185 Assert.AreEqual("testtag5", xmlElement.Name);
186 Assert.AreEqual(1, xmlElement.Attributes.Count);
187 Assert.AreEqual("testvalue2", xmlElement.Attributes["testattr2"]);
191 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(普通でNGパターン)。
194 public void TestTryParseNormalNg()
197 XmlElementParser parser = new XmlElementParser(this.xmlParser);
199 Assert.IsFalse(parser.TryParse(" <testtag></testtag>", out element));
200 Assert.IsNull(element);
201 Assert.IsFalse(parser.TryParse("<!-- comment -->", out element));
202 Assert.IsNull(element);
203 Assert.IsFalse(parser.TryParse(string.Empty, out element));
204 Assert.IsNull(element);
205 Assert.IsFalse(parser.TryParse(null, out element));
206 Assert.IsNull(element);
210 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(単一のパターン)。
213 public void TestTryParseSingle()
216 XmlElement xmlElement;
217 XmlElementParser parser = new XmlElementParser(this.xmlParser);
219 Assert.IsTrue(parser.TryParse("<testtag />", out element));
220 xmlElement = (XmlElement)element;
221 Assert.AreEqual("<testtag />", xmlElement.ToString());
222 Assert.AreEqual("testtag", xmlElement.Name);
223 Assert.AreEqual(0, xmlElement.Attributes.Count);
225 Assert.IsTrue(parser.TryParse("<testtag2/>", out element));
226 xmlElement = (XmlElement)element;
227 Assert.AreEqual("<testtag2/>", xmlElement.ToString());
228 Assert.AreEqual("testtag2", xmlElement.Name);
229 Assert.AreEqual(0, xmlElement.Attributes.Count);
231 Assert.IsTrue(parser.TryParse("<testtag3 />testtag4 />", out element));
232 xmlElement = (XmlElement)element;
233 Assert.AreEqual("<testtag3 />", xmlElement.ToString());
234 Assert.AreEqual("testtag3", xmlElement.Name);
235 Assert.AreEqual(0, xmlElement.Attributes.Count);
237 Assert.IsTrue(parser.TryParse("<testtag5 testattr=\"testvalue\" />/>", out element));
238 xmlElement = (XmlElement)element;
239 Assert.AreEqual("<testtag5 testattr=\"testvalue\" />", xmlElement.ToString());
240 Assert.AreEqual("testtag5", xmlElement.Name);
241 Assert.AreEqual(1, xmlElement.Attributes.Count);
242 Assert.AreEqual("testvalue", xmlElement.Attributes["testattr"]);
244 Assert.IsTrue(parser.TryParse("<testtag6 testattr1=\"testvalue1\" testattr2=\"testvalue2\"/>/>", out element));
245 xmlElement = (XmlElement)element;
246 Assert.AreEqual("<testtag6 testattr1=\"testvalue1\" testattr2=\"testvalue2\"/>", xmlElement.ToString());
247 Assert.AreEqual("testtag6", xmlElement.Name);
248 Assert.AreEqual(2, xmlElement.Attributes.Count);
249 Assert.AreEqual("testvalue1", xmlElement.Attributes["testattr1"]);
250 Assert.AreEqual("testvalue2", xmlElement.Attributes["testattr2"]);
254 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(不正な構文)。
257 public void TestTryParseLazy()
260 XmlElement xmlElement;
261 XmlElementParser parser = new XmlElementParser(this.xmlParser);
263 Assert.IsTrue(parser.TryParse("<p>", out element));
264 xmlElement = (XmlElement)element;
265 Assert.AreEqual("<p>", xmlElement.ToString());
266 Assert.AreEqual("p", xmlElement.Name);
267 Assert.AreEqual(0, xmlElement.Attributes.Count);
269 Assert.IsTrue(parser.TryParse("<testtag>test value", out element));
270 xmlElement = (XmlElement)element;
271 Assert.AreEqual("<testtag>test value", xmlElement.ToString());
272 Assert.AreEqual("testtag", xmlElement.Name);
273 Assert.AreEqual(0, xmlElement.Attributes.Count);
275 Assert.IsTrue(parser.TryParse("<testtag2 testattr=test value>test value</testtag2>", out element));
276 xmlElement = (XmlElement)element;
277 Assert.AreEqual("<testtag2 testattr=test value>test value</testtag2>", xmlElement.ToString());
278 Assert.AreEqual("testtag2", xmlElement.Name);
279 Assert.AreEqual(2, xmlElement.Attributes.Count);
280 Assert.AreEqual("test", xmlElement.Attributes["testattr"]);
281 Assert.AreEqual(string.Empty, xmlElement.Attributes["value"]);
283 Assert.IsTrue(parser.TryParse("<testtag3>test value2</ testtag3>testend", out element));
284 xmlElement = (XmlElement)element;
285 Assert.AreEqual("<testtag3>test value2</ testtag3>testend", xmlElement.ToString());
286 Assert.AreEqual("testtag3", xmlElement.Name);
287 Assert.AreEqual(0, xmlElement.Attributes.Count);
291 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(不正でNG)。
294 public void TestTryParseLazyNg()
297 XmlElementParser parser = new XmlElementParser(this.xmlParser);
299 Assert.IsFalse(parser.TryParse("< testtag></testtag>", out element));
300 Assert.IsNull(element);
301 Assert.IsFalse(parser.TryParse("<testtag", out element));
302 Assert.IsNull(element);
303 Assert.IsFalse(parser.TryParse("<testtag ", out element));
304 Assert.IsNull(element);
305 Assert.IsFalse(parser.TryParse("<testtag /", out element));
306 Assert.IsNull(element);
307 Assert.IsFalse(parser.TryParse("<testtag </testtag>", out element));
308 Assert.IsNull(element);
309 Assert.IsFalse(parser.TryParse("<testtag testattr=\"testvalue'></testtag>", out element));
310 Assert.IsNull(element);
311 Assert.IsFalse(parser.TryParse("<sub((>4</sub>", out element));
312 Assert.IsNull(element);
316 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(HTML)。
319 public void TestTryParseHtml()
322 HtmlElement htmlElement;
323 this.xmlParser.IsHtml = true;
324 XmlElementParser parser = new XmlElementParser(this.xmlParser);
326 Assert.IsTrue(parser.TryParse("<testtag />", out element));
327 htmlElement = (HtmlElement)element;
328 Assert.AreEqual("<testtag />", htmlElement.ToString());
329 Assert.AreEqual("testtag", htmlElement.Name);
330 Assert.AreEqual(0, htmlElement.Attributes.Count);
332 Assert.IsTrue(parser.TryParse("<p>", out element));
333 htmlElement = (HtmlElement)element;
334 Assert.AreEqual("<p>", htmlElement.ToString());
335 Assert.AreEqual("p", htmlElement.Name);
336 Assert.AreEqual(0, htmlElement.Attributes.Count);
338 Assert.IsTrue(parser.TryParse("<testtag2 />testtag3 />", out element));
339 htmlElement = (HtmlElement)element;
340 Assert.AreEqual("<testtag2 />", htmlElement.ToString());
341 Assert.AreEqual("testtag2", htmlElement.Name);
342 Assert.AreEqual(0, htmlElement.Attributes.Count);
344 Assert.IsTrue(parser.TryParse("<testtag4></testtag5>", out element));
345 htmlElement = (HtmlElement)element;
346 Assert.AreEqual("<testtag4>", htmlElement.ToString());
347 Assert.AreEqual("testtag4", htmlElement.Name);
348 Assert.AreEqual(0, htmlElement.Attributes.Count);
350 Assert.IsTrue(parser.TryParse("<testtag6 testattr=\"testvalue\">>", out element));
351 htmlElement = (HtmlElement)element;
352 Assert.AreEqual("<testtag6 testattr=\"testvalue\">", htmlElement.ToString());
353 Assert.AreEqual("testtag6", htmlElement.Name);
354 Assert.AreEqual(1, htmlElement.Attributes.Count);
355 Assert.AreEqual("testvalue", htmlElement.Attributes["testattr"]);
357 Assert.IsTrue(parser.TryParse("<testtag7 testattr1=\"testvalue1\" testattr2=\"testvalue2\">test</testtag7>", out element));
358 htmlElement = (HtmlElement)element;
359 Assert.AreEqual("<testtag7 testattr1=\"testvalue1\" testattr2=\"testvalue2\">test</testtag7>", htmlElement.ToString());
360 Assert.AreEqual("testtag7", htmlElement.Name);
361 Assert.AreEqual(2, htmlElement.Attributes.Count);
362 Assert.AreEqual("testvalue1", htmlElement.Attributes["testattr1"]);
363 Assert.AreEqual("testvalue2", htmlElement.Attributes["testattr2"]);
367 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(大文字小文字)。
370 public void TestTryParseIgnoreCase()
373 XmlElement xmlElement;
374 this.xmlParser.IgnoreCase = false;
375 XmlElementParser parser = new XmlElementParser(this.xmlParser);
377 Assert.IsTrue(parser.TryParse("<testtag></testtag></Testtag>", out element));
378 xmlElement = (XmlElement)element;
379 Assert.AreEqual("<testtag></testtag>", xmlElement.ToString());
380 Assert.AreEqual("testtag", xmlElement.Name);
381 Assert.AreEqual(0, xmlElement.Attributes.Count);
383 Assert.IsTrue(parser.TryParse("<testtag></Testtag></testtag>", out element));
384 xmlElement = (XmlElement)element;
385 Assert.AreEqual("<testtag></Testtag></testtag>", xmlElement.ToString());
386 Assert.AreEqual("testtag", xmlElement.Name);
387 Assert.AreEqual(0, xmlElement.Attributes.Count);
389 this.xmlParser.IgnoreCase = true;
390 Assert.IsTrue(parser.TryParse("<testtag></Testtag></testtag>", out element));
391 xmlElement = (XmlElement)element;
392 Assert.AreEqual("<testtag></Testtag>", xmlElement.ToString());
393 Assert.AreEqual("testtag", xmlElement.Name);
394 Assert.AreEqual(0, xmlElement.Attributes.Count);
398 /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(タグ限定)。
401 public void TestTryParseTargets()
404 XmlElementParser parser = new XmlElementParser(this.xmlParser);
406 // 特定のタグのみを処理対象とするよう指定する
407 parser.Targets = new string[] { "div", "span" };
408 Assert.IsFalse(parser.TryParse("<h1>test</h1>", out element));
409 Assert.IsFalse(parser.TryParse("<br />", out element));
410 Assert.IsTrue(parser.TryParse("<div>test</div>", out element));
411 Assert.AreEqual("<div>test</div>", element.ToString());
413 // XmlParserに大文字小文字無視が指定されている場合、ここも無視する
414 Assert.IsTrue(parser.TryParse("<sPan>test</span>", out element));
415 Assert.AreEqual("<sPan>test</span>", element.ToString());
418 this.xmlParser.IgnoreCase = false;
419 Assert.IsFalse(parser.TryParse("<sPan>test</span>", out element));
420 Assert.IsTrue(parser.TryParse("<span>test</span>", out element));
421 Assert.AreEqual("<span>test</span>", element.ToString());
425 /// <see cref="XmlElementParser.IsPossibleParse"/>メソッドテストケース。
428 public void TestIsElementPossible()
430 XmlElementParser parser = new XmlElementParser(new XmlParser());
431 Assert.IsTrue(parser.IsPossibleParse('<'));
432 Assert.IsFalse(parser.IsPossibleParse('['));
433 Assert.IsFalse(parser.IsPossibleParse('-'));
434 Assert.IsFalse(parser.IsPossibleParse('/'));
435 Assert.IsFalse(parser.IsPossibleParse('#'));