OSDN Git Service

#30244 Visual Studioの自動テストはテストクラスがinternalだと実行されていなかったので修正,
[wptscs/wpts.git] / HmLibTest / Parsers / AbstractTextParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      AbstractTextParserのテストクラスソース。</summary>
4 //
5 // <copyright file="AbstractTextParserTest.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 System.Collections.Generic;
15     using System.Text;
16     using Honememo.Utilities;
17     using Microsoft.VisualStudio.TestTools.UnitTesting;
18
19     /// <summary>
20     /// <see cref="AbstractTextParser"/>のテストクラスです。
21     /// </summary>
22     [TestClass]
23     public class AbstractTextParserTest
24     {
25         #region インタフェース実装メソッドテストケース
26
27         /// <summary>
28         /// <see cref="AbstractTextParser.TryParseToEndCondition"/>メソッドテストケース。
29         /// </summary>
30         [TestMethod]
31         public void TestTryParseToEndCondition()
32         {
33             IElement element;
34             TestTextParser parser = new TestTextParser();
35
36             // conditionの指定がないときは、文字列を最後までTryParseElementAtで解析
37             parser.Success = true;
38             Assert.IsFalse(parser.TryParseToEndCondition(null, null, out element));
39             Assert.IsNull(element);
40
41             Assert.IsTrue(parser.TryParseToEndCondition(string.Empty, null, out element));
42             Assert.AreEqual(string.Empty, element.ToString());
43             Assert.IsInstanceOfType(element, typeof(TextElement));
44
45             Assert.IsTrue(parser.TryParseToEndCondition("0123456789", null, out element));
46             Assert.AreEqual("0123456789", element.ToString());
47             Assert.IsInstanceOfType(element, typeof(ListElement));
48             ListElement list = (ListElement)element;
49             Assert.AreEqual(10, list.Count);
50             foreach (IElement e in list)
51             {
52                 Assert.IsInstanceOfType(e, typeof(TextElement));
53             }
54
55             // conditionが指定されている場合は、その条件を満たすまで
56             Assert.IsTrue(parser.TryParseToEndCondition(
57                 "0123456789",
58                 (string s, int index) => s[index] == '5',
59                 out element));
60             Assert.AreEqual("01234", element.ToString());
61             Assert.IsInstanceOfType(element, typeof(ListElement));
62         }
63
64         /// <summary>
65         /// <see cref="AbstractTextParser.TryParseToDelimiter"/>メソッドテストケース。
66         /// </summary>
67         [TestMethod]
68         public void TestTryParseToDelimiter()
69         {
70             IElement element;
71             TestTextParser parser = new TestTextParser();
72
73             // delimitersの指定がないときは、condition無しのTryParseToEndConditionと同じ
74             parser.Success = true;
75             Assert.IsFalse(parser.TryParseToDelimiter(null, out element));
76             Assert.IsNull(element);
77
78             Assert.IsTrue(parser.TryParseToDelimiter(string.Empty, out element));
79             Assert.AreEqual(string.Empty, element.ToString());
80             Assert.IsInstanceOfType(element, typeof(TextElement));
81
82             Assert.IsTrue(parser.TryParseToDelimiter("[[test]] is good", out element));
83             Assert.AreEqual("[[test]] is good", element.ToString());
84             Assert.IsInstanceOfType(element, typeof(ListElement));
85
86             // delimitersが指定されている場合は、その文字列まで
87             // ※ 本当は "test]] is good" にした状態で用いる
88             Assert.IsTrue(parser.TryParseToDelimiter("[[test]] is good", out element, "]]"));
89             Assert.AreEqual("[[test", element.ToString());
90             Assert.IsInstanceOfType(element, typeof(ListElement));
91
92             // delimitersは複数指定可能、先に見つけたもの優先
93             Assert.IsTrue(parser.TryParseToDelimiter("[[test]] is good", out element, "]]", "s"));
94             Assert.AreEqual("[[te", element.ToString());
95             Assert.IsInstanceOfType(element, typeof(ListElement));
96
97             // delimitersの指定があっても見つからないときは最後まで処理する
98             Assert.IsTrue(parser.TryParseToDelimiter("[[test]] is good", out element, "}}"));
99             Assert.AreEqual("[[test]] is good", element.ToString());
100             Assert.IsInstanceOfType(element, typeof(ListElement));
101         }
102
103         /// <summary>
104         /// <see cref="AbstractTextParser.TryParseToDelimiter"/>メソッドテストケース(null)。
105         /// </summary>
106         [TestMethod]
107         [ExpectedException(typeof(ArgumentNullException))]
108         public void TestTryParseToDelimiterNull()
109         {
110             IElement element;
111             string[] delimiters = null;
112             new TestTextParser().TryParseToDelimiter(null, out element, delimiters);
113         }
114
115         /// <summary>
116         /// <see cref="AbstractTextParser.TryParse"/>メソッドテストケース。
117         /// </summary>
118         [TestMethod]
119         public void TestTryParse()
120         {
121             IElement element;
122             TestTextParser parser = new TestTextParser();
123
124             // condition無しのTryParseToEndConditionと同じ
125             parser.Success = true;
126             Assert.IsFalse(parser.TryParse(null, out element));
127             Assert.IsNull(element);
128
129             Assert.IsTrue(parser.TryParse(string.Empty, out element));
130             Assert.AreEqual(string.Empty, element.ToString());
131             Assert.IsInstanceOfType(element, typeof(TextElement));
132
133             Assert.IsTrue(parser.TryParse("0123456789", out element));
134             Assert.AreEqual("0123456789", element.ToString());
135             Assert.IsInstanceOfType(element, typeof(ListElement));
136             ListElement list = (ListElement)element;
137         }
138
139         #endregion
140
141         #region 実装支援用メソッドテストケース
142
143         /// <summary>
144         /// <see cref="AbstractTextParser.FlashText"/>メソッドテストケース(正常系)。
145         /// </summary>
146         [TestMethod]
147         public void TestFlashText()
148         {
149             // ビルダーに値が詰まっている場合、その内容をリストに追加してクリアする
150             ListElement list = new ListElement();
151             StringBuilder b = new StringBuilder();
152             TestTextParser parser = new TestTextParser();
153
154             parser.FlashText(ref list, ref b);
155             Assert.AreEqual(0, list.Count);
156             Assert.AreEqual(string.Empty, b.ToString());
157
158             b.Append("1st string");
159             parser.FlashText(ref list, ref b);
160             Assert.AreEqual(1, list.Count);
161             Assert.AreEqual("1st string", list[0].ToString());
162             Assert.IsInstanceOfType(list[0], typeof(TextElement));
163             Assert.AreEqual(string.Empty, b.ToString());
164
165             b.Append("2nd string");
166             parser.FlashText(ref list, ref b);
167             Assert.AreEqual(2, list.Count);
168             Assert.AreEqual("1st string", list[0].ToString());
169             Assert.AreEqual("2nd string", list[1].ToString());
170             Assert.IsInstanceOfType(list[1], typeof(TextElement));
171             Assert.AreEqual(string.Empty, b.ToString());
172         }
173
174         /// <summary>
175         /// <see cref="AbstractTextParser.FlashText"/>メソッドテストケース(リストがnull)。
176         /// </summary>
177         [TestMethod]
178         [ExpectedException(typeof(ArgumentNullException))]
179         public void TestFlashTextListNull()
180         {
181             ListElement list = null;
182             StringBuilder b = new StringBuilder();
183             new TestTextParser().FlashText(ref list, ref b);
184         }
185
186         /// <summary>
187         /// <see cref="AbstractTextParser.FlashText"/>メソッドテストケース(ビルダーがnull)。
188         /// </summary>
189         [TestMethod]
190         [ExpectedException(typeof(ArgumentNullException))]
191         public void TestFlashTextBNull()
192         {
193             ListElement list = new ListElement();
194             StringBuilder b = null;
195             new TestTextParser().FlashText(ref list, ref b);
196         }
197
198         #endregion
199
200         #region テスト用AbstractTextParser実装
201
202         /// <summary>
203         /// テスト用<see cref="AbstractTextParser"/>実装クラスです。
204         /// </summary>
205         private class TestTextParser : AbstractTextParser
206         {
207             #region テスト用プロパティ
208
209             /// <summary>
210             /// <see cref="TryParseElementAt"/>の戻り値。
211             /// </summary>
212             public bool Success
213             {
214                 get;
215                 set;
216             }
217
218             #endregion
219
220             #region 非公開メソッドテスト用のオーラーライドメソッド
221
222             /// <summary>
223             /// 文字列が空でない場合、リストにText要素を追加して、文字列をリセットする。
224             /// </summary>
225             /// <param name="list">追加されるリスト。</param>
226             /// <param name="b">追加する文字列。</param>
227             /// <exception cref="ArgumentNullException"><paramref name="list"/>または<paramref name="b"/>が<c>null</c>の場合。</exception>
228             public new void FlashText(ref ListElement list, ref StringBuilder b)
229             {
230                 base.FlashText(ref list, ref b);
231             }
232
233             #endregion
234
235             #region テスト用メソッド実装
236
237             /// <summary>
238             /// 渡されたテキストの指定されたインデックス位置を各種解析処理で解析する。
239             /// </summary>
240             /// <param name="s">解析するテキスト。</param>
241             /// <param name="index">処理インデックス。</param>
242             /// <param name="result">解析結果。渡された文字列のインデックス位置の値を要素にして返す。</param>
243             /// <returns><see cref="Success"/>の設定値。</returns>
244             protected override bool TryParseElementAt(string s, int index, out IElement result)
245             {
246                 result = new TextElement(s[index].ToString());
247                 return this.Success;
248             }
249
250             #endregion
251         }
252
253         #endregion
254     }
255 }