OSDN Git Service

#30244 Visual Studioの自動テストはテストクラスがinternalだと実行されていなかったので修正,
[wptscs/wpts.git] / HmLibTest / Parsers / XmlElementParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      XmlElementParserのテストクラスソース。</summary>
4 //
5 // <copyright file="XmlElementParserTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Parsers
12 {
13     using System;
14     using Microsoft.VisualStudio.TestTools.UnitTesting;
15
16     /// <summary>
17     /// <see cref="XmlElementParser"/>のテストクラスです。
18     /// </summary>
19     [TestClass]
20     public class XmlElementParserTest
21     {
22         #region private変数
23
24         /// <summary>
25         /// 前処理・後処理で毎回生成/解放される<see cref="XmlParser"/>。
26         /// </summary>
27         private XmlParser xmlParser;
28
29         #endregion
30
31         #region 前処理・後処理
32
33         /// <summary>
34         /// テストの前処理。
35         /// </summary>
36         /// <remarks><see cref="XmlParser.Dispose"/>が必要な<see cref="XmlParser"/>の生成。</remarks>
37         [TestInitialize]
38         public void SetUp()
39         {
40             this.xmlParser = new XmlParser();
41         }
42
43         /// <summary>
44         /// テストの後処理。
45         /// </summary>
46         /// <remarks><see cref="XmlParser.Dispose"/>が必要な<see cref="XmlParser"/>の解放。</remarks>
47         [TestCleanup]
48         public void TearDown()
49         {
50             this.xmlParser.Dispose();
51         }
52
53         #endregion
54
55         #region 公開プロパティテストケース
56
57         /// <summary>
58         /// <see cref="XmlElementParser.Targets"/>プロパティテストケース。
59         /// </summary>
60         [TestMethod]
61         public void TestTargets()
62         {
63             XmlElementParser parser = new XmlElementParser(this.xmlParser);
64
65             // 初期状態でオブジェクトが存在すること
66             Assert.IsNotNull(parser.Targets);
67             Assert.AreEqual(0, parser.Targets.Count);
68             parser.Targets.Add("span");
69             Assert.AreEqual("span", parser.Targets[0]);
70
71             // 設定すればそのオブジェクトが入ること
72             string[] targets = new string[] { "div", "p" };
73             parser.Targets = targets;
74             Assert.AreSame(targets, parser.Targets);
75         }
76
77         /// <summary>
78         /// <see cref="XmlElementParser.Targets"/>プロパティテストケース(null)。
79         /// </summary>
80         [TestMethod]
81         [ExpectedException(typeof(ArgumentNullException))]
82         public void TestTargetsNull()
83         {
84             new XmlElementParser(this.xmlParser).Targets = null;
85         }
86
87         #endregion
88
89         #region インタフェース実装メソッドテストケース
90
91         /// <summary>
92         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(実例)。
93         /// </summary>
94         [TestMethod]
95         public void TestTryParse()
96         {
97             IElement element;
98             XmlElement xmlElement;
99             XmlElementParser parser = new XmlElementParser(this.xmlParser);
100
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);
106
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);
112
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"]);
120
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);
127
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"]);
137
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"]);
144         }
145
146         /// <summary>
147         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(基本形)。
148         /// </summary>
149         [TestMethod]
150         public void TestTryParseNormal()
151         {
152             IElement element;
153             XmlElement xmlElement;
154             XmlElementParser parser = new XmlElementParser(this.xmlParser);
155
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);
161
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);
167
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);
173
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"]);
180
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"]);
188         }
189
190         /// <summary>
191         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(普通でNGパターン)。
192         /// </summary>
193         [TestMethod]
194         public void TestTryParseNormalNg()
195         {
196             IElement element;
197             XmlElementParser parser = new XmlElementParser(this.xmlParser);
198
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);
207         }
208
209         /// <summary>
210         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(単一のパターン)。
211         /// </summary>
212         [TestMethod]
213         public void TestTryParseSingle()
214         {
215             IElement element;
216             XmlElement xmlElement;
217             XmlElementParser parser = new XmlElementParser(this.xmlParser);
218
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);
224
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);
230
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);
236
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"]);
243
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"]);
251         }
252
253         /// <summary>
254         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(不正な構文)。
255         /// </summary>
256         [TestMethod]
257         public void TestTryParseLazy()
258         {
259             IElement element;
260             XmlElement xmlElement;
261             XmlElementParser parser = new XmlElementParser(this.xmlParser);
262
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);
268
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);
274
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"]);
282
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);
288         }
289
290         /// <summary>
291         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(不正でNG)。
292         /// </summary>
293         [TestMethod]
294         public void TestTryParseLazyNg()
295         {
296             IElement element;
297             XmlElementParser parser = new XmlElementParser(this.xmlParser);
298
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);
313         }
314
315         /// <summary>
316         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(HTML)。
317         /// </summary>
318         [TestMethod]
319         public void TestTryParseHtml()
320         {
321             IElement element;
322             HtmlElement htmlElement;
323             this.xmlParser.IsHtml = true;
324             XmlElementParser parser = new XmlElementParser(this.xmlParser);
325
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);
331
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);
337
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);
343
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);
349
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"]);
356
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"]);
364         }
365
366         /// <summary>
367         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(大文字小文字)。
368         /// </summary>
369         [TestMethod]
370         public void TestTryParseIgnoreCase()
371         {
372             IElement element;
373             XmlElement xmlElement;
374             this.xmlParser.IgnoreCase = false;
375             XmlElementParser parser = new XmlElementParser(this.xmlParser);
376
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);
382
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);
388
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);
395         }
396
397         /// <summary>
398         /// <see cref="XmlElementParser.TryParse"/>メソッドテストケース(タグ限定)。
399         /// </summary>
400         [TestMethod]
401         public void TestTryParseTargets()
402         {
403             IElement element;
404             XmlElementParser parser = new XmlElementParser(this.xmlParser);
405
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());
412
413             // XmlParserに大文字小文字無視が指定されている場合、ここも無視する
414             Assert.IsTrue(parser.TryParse("<sPan>test</span>", out element));
415             Assert.AreEqual("<sPan>test</span>", element.ToString());
416
417             // 指定されていない場合、区別する
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());
422         }
423
424         /// <summary>
425         /// <see cref="XmlElementParser.IsPossibleParse"/>メソッドテストケース。
426         /// </summary>
427         [TestMethod]
428         public void TestIsElementPossible()
429         {
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('#'));
436         }
437
438         #endregion
439     }
440 }