OSDN Git Service

1cbb40dccafd8d4e96d474ae67542e5060c5befe
[wptscs/wpts.git] / HmLibTest / Parsers / AbstractParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      AbstractParserのテストクラスソース。</summary>
4 //
5 // <copyright file="AbstractParserTest.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 NUnit.Framework;
15
16     /// <summary>
17     /// <see cref="AbstractParser"/>のテストクラスです。
18     /// </summary>
19     [TestFixture]
20     internal class AbstractParserTest
21     {
22         #region インタフェース実装メソッドテストケース
23
24         /// <summary>
25         /// <see cref="AbstractParser.Parse"/>メソッドテストケース。
26         /// </summary>
27         [Test]
28         public void TestParse()
29         {
30             // TryParseを呼んだ結果が返ること
31             TestParser parser = new TestParser();
32             parser.Success = true;
33             Assert.AreEqual(String.Empty, parser.Parse(String.Empty).ToString());
34             Assert.AreEqual("test", parser.Parse("test").ToString());
35         }
36
37         /// <summary>
38         /// <see cref="AbstractParser.Parse"/>メソッドテストケース(null)。
39         /// </summary>
40         [Test]
41         [ExpectedException(typeof(ArgumentNullException))]
42         public void TestParseNull()
43         {
44             TestParser parser = new TestParser();
45             parser.Success = true;
46             parser.Parse(null);
47         }
48
49         /// <summary>
50         /// <see cref="AbstractParser.Parse"/>メソッドテストケース(解析失敗)。
51         /// </summary>
52         [Test]
53         [ExpectedException(typeof(FormatException))]
54         public void TestParseFail()
55         {
56             // TryParseがfalseを返した場合、例外を投げる
57             TestParser parser = new TestParser();
58             parser.Success = false;
59             parser.Parse(String.Empty);
60         }
61
62         /// <summary>
63         /// <see cref="AbstractParser.IsPossibleParse"/>メソッドテストケース。
64         /// </summary>
65         [Test]
66         public void TestIsPossibleParse()
67         {
68             // このクラスでは何を渡してもtrueが返る
69             TestParser parser = new TestParser();
70             Assert.IsTrue(parser.IsPossibleParse('a'));
71             Assert.IsTrue(parser.IsPossibleParse('<'));
72             Assert.IsTrue(parser.IsPossibleParse('>'));
73             Assert.IsTrue(parser.IsPossibleParse('='));
74             Assert.IsTrue(parser.IsPossibleParse('-'));
75             Assert.IsTrue(parser.IsPossibleParse('['));
76             Assert.IsTrue(parser.IsPossibleParse('{'));
77         }
78
79         #endregion
80
81         #region 実装支援用メソッドテストケース
82
83         /// <summary>
84         /// <see cref="AbstractParser.TryParseAt"/>メソッドテストケース。
85         /// </summary>
86         [Test]
87         public void TestTryParseAt()
88         {
89             // 指定したパーサーで該当のインデックスの文字を解析する
90             IElement element;
91             TestParser parser = new TestParser();
92
93             parser.Success = true;
94             Assert.IsFalse(parser.TryParseAt("a", 0, out element));
95             Assert.IsNull(element);
96             Assert.IsTrue(parser.TryParseAt("a", 0, out element, parser));
97             Assert.AreEqual("a", element.ToString());
98
99             Assert.IsFalse(parser.TryParseAt("test[[test]]", 4, out element));
100             Assert.IsNull(element);
101             Assert.IsTrue(parser.TryParseAt("test[[test]]", 4, out element, parser));
102             Assert.AreEqual("[[test]]", element.ToString());
103
104             parser.Success = false;
105             Assert.IsFalse(parser.TryParseAt("a", 0, out element, parser));
106             Assert.IsNull(element);
107             Assert.IsFalse(parser.TryParseAt("test[[test]]", 4, out element, parser));
108             Assert.IsNull(element);
109         }
110
111         /// <summary>
112         /// <see cref="AbstractParser.TryParseAt"/>メソッドテストケース(null)。
113         /// </summary>
114         [Test]
115         [ExpectedException(typeof(ArgumentNullException))]
116         public void TestTryParseAtNull()
117         {
118             IElement element;
119             TestParser parser = new TestParser();
120             parser.Success = true;
121             parser.TryParseAt(null, 0, out element);
122         }
123
124         /// <summary>
125         /// <see cref="AbstractParser.TryParseAt"/>メソッドテストケース(範囲外)。
126         /// </summary>
127         [Test]
128         [ExpectedException(typeof(ArgumentOutOfRangeException))]
129         public void TestTryParseAtOutOfRange()
130         {
131             IElement element;
132             TestParser parser = new TestParser();
133             parser.Success = true;
134             parser.TryParseAt(String.Empty, 1, out element);
135         }
136
137         #endregion
138
139         #region テスト用AbstractParser実装
140
141         /// <summary>
142         /// テスト用<see cref="AbstractParser"/>実装クラスです。
143         /// </summary>
144         private class TestParser : AbstractParser
145         {
146             #region テスト用プロパティ
147
148             /// <summary>
149             /// <see cref="TryParse"/>の戻り値。
150             /// </summary>
151             public bool Success
152             {
153                 get;
154                 set;
155             }
156
157             #endregion
158
159             #region テスト用メソッド実装
160
161             /// <summary>
162             /// 渡された文字列の解析を行う。
163             /// </summary>
164             /// <param name="s">解析対象の文字列。</param>
165             /// <param name="result">解析結果。渡された文字列をそのまま要素にして返す。</param>
166             /// <returns><see cref="Success"/>の設定値。</returns>
167             public override bool TryParse(string s, out IElement result)
168             {
169                 result = new TextElement(s);
170                 return this.Success;
171             }
172
173             #endregion
174
175             #region 非公開メソッドテスト用のオーラーライドメソッド
176
177             /// <summary>
178             /// 渡されたテキストの指定されたインデックス位置を各種解析処理で解析する。
179             /// </summary>
180             /// <param name="s">解析するテキスト。</param>
181             /// <param name="index">処理インデックス。</param>
182             /// <param name="result">解析した結果要素。</param>
183             /// <param name="parsers">解析に用いるパーサー。指定された順に使用。</param>
184             /// <returns>いずれかのパーサーで解析できた場合<c>true</c>。</returns>
185             /// <exception cref="ArgumentNullException"><paramref name="s"/>または<paramref name="parsers"/>が<c>null</c>の場合。</exception>
186             /// <exception cref="ArgumentOutOfRangeException">インデックスが文字列の範囲外の場合。</exception>
187             public new bool TryParseAt(string s, int index, out IElement result, params IParser[] parsers)
188             {
189                 return base.TryParseAt(s, index, out result, parsers);
190             }
191
192             #endregion
193         }
194
195         #endregion
196     }
197 }