1 // ================================================================================================
3 // AbstractTextParserのテストクラスソース。</summary>
5 // <copyright file="AbstractTextParserTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Parsers
14 using System.Collections.Generic;
16 using Honememo.Utilities;
17 using Microsoft.VisualStudio.TestTools.UnitTesting;
20 /// <see cref="AbstractTextParser"/>のテストクラスです。
23 public class AbstractTextParserTest
25 #region インタフェース実装メソッドテストケース
28 /// <see cref="AbstractTextParser.TryParseToEndCondition"/>メソッドテストケース。
31 public void TestTryParseToEndCondition()
34 TestTextParser parser = new TestTextParser();
36 // conditionの指定がないときは、文字列を最後までTryParseElementAtで解析
37 parser.Success = true;
38 Assert.IsFalse(parser.TryParseToEndCondition(null, null, out element));
39 Assert.IsNull(element);
41 Assert.IsTrue(parser.TryParseToEndCondition(string.Empty, null, out element));
42 Assert.AreEqual(string.Empty, element.ToString());
43 Assert.IsInstanceOfType(element, typeof(TextElement));
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)
52 Assert.IsInstanceOfType(e, typeof(TextElement));
55 // conditionが指定されている場合は、その条件を満たすまで
56 Assert.IsTrue(parser.TryParseToEndCondition(
58 (string s, int index) => s[index] == '5',
60 Assert.AreEqual("01234", element.ToString());
61 Assert.IsInstanceOfType(element, typeof(ListElement));
65 /// <see cref="AbstractTextParser.TryParseToDelimiter"/>メソッドテストケース。
68 public void TestTryParseToDelimiter()
71 TestTextParser parser = new TestTextParser();
73 // delimitersの指定がないときは、condition無しのTryParseToEndConditionと同じ
74 parser.Success = true;
75 Assert.IsFalse(parser.TryParseToDelimiter(null, out element));
76 Assert.IsNull(element);
78 Assert.IsTrue(parser.TryParseToDelimiter(string.Empty, out element));
79 Assert.AreEqual(string.Empty, element.ToString());
80 Assert.IsInstanceOfType(element, typeof(TextElement));
82 Assert.IsTrue(parser.TryParseToDelimiter("[[test]] is good", out element));
83 Assert.AreEqual("[[test]] is good", element.ToString());
84 Assert.IsInstanceOfType(element, typeof(ListElement));
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));
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));
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));
104 /// <see cref="AbstractTextParser.TryParseToDelimiter"/>メソッドテストケース(null)。
107 [ExpectedException(typeof(ArgumentNullException))]
108 public void TestTryParseToDelimiterNull()
111 string[] delimiters = null;
112 new TestTextParser().TryParseToDelimiter(null, out element, delimiters);
116 /// <see cref="AbstractTextParser.TryParse"/>メソッドテストケース。
119 public void TestTryParse()
122 TestTextParser parser = new TestTextParser();
124 // condition無しのTryParseToEndConditionと同じ
125 parser.Success = true;
126 Assert.IsFalse(parser.TryParse(null, out element));
127 Assert.IsNull(element);
129 Assert.IsTrue(parser.TryParse(string.Empty, out element));
130 Assert.AreEqual(string.Empty, element.ToString());
131 Assert.IsInstanceOfType(element, typeof(TextElement));
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;
141 #region 実装支援用メソッドテストケース
144 /// <see cref="AbstractTextParser.FlashText"/>メソッドテストケース(正常系)。
147 public void TestFlashText()
149 // ビルダーに値が詰まっている場合、その内容をリストに追加してクリアする
150 ListElement list = new ListElement();
151 StringBuilder b = new StringBuilder();
152 TestTextParser parser = new TestTextParser();
154 parser.FlashText(ref list, ref b);
155 Assert.AreEqual(0, list.Count);
156 Assert.AreEqual(string.Empty, b.ToString());
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());
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());
175 /// <see cref="AbstractTextParser.FlashText"/>メソッドテストケース(リストがnull)。
178 [ExpectedException(typeof(ArgumentNullException))]
179 public void TestFlashTextListNull()
181 ListElement list = null;
182 StringBuilder b = new StringBuilder();
183 new TestTextParser().FlashText(ref list, ref b);
187 /// <see cref="AbstractTextParser.FlashText"/>メソッドテストケース(ビルダーがnull)。
190 [ExpectedException(typeof(ArgumentNullException))]
191 public void TestFlashTextBNull()
193 ListElement list = new ListElement();
194 StringBuilder b = null;
195 new TestTextParser().FlashText(ref list, ref b);
200 #region テスト用AbstractTextParser実装
203 /// テスト用<see cref="AbstractTextParser"/>実装クラスです。
205 private class TestTextParser : AbstractTextParser
210 /// <see cref="TryParseElementAt"/>の戻り値。
220 #region 非公開メソッドテスト用のオーラーライドメソッド
223 /// 文字列が空でない場合、リストにText要素を追加して、文字列をリセットする。
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)
230 base.FlashText(ref list, ref b);
238 /// 渡されたテキストの指定されたインデックス位置を各種解析処理で解析する。
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)
246 result = new TextElement(s[index].ToString());