OSDN Git Service

svn:ignoreを設定
[wptscs/wpts.git] / HmLibTest / Models / TreeNodeTest.cs
1 // ================================================================================================
2 // <summary>
3 //      TreeNodeのテストクラスソース。</summary>
4 //
5 // <copyright file="TreeNodeTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2011 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Models
12 {
13     using System;
14     using System.Collections.Generic;
15     using NUnit.Framework;
16
17     /// <summary>
18     /// TreeNodeのテストクラスです。
19     /// </summary>
20     [TestFixture]
21     public class TreeNodeTest
22     {
23         #region コンストラクタテストケース
24
25         /// <summary>
26         /// コンストラクタテストケース。
27         /// </summary>
28         [Test]
29         public void TestConstructor()
30         {
31             // 引数無しの場合null
32             TreeNode<string> node = new TreeNode<string>();
33             Assert.IsNull(node.Value);
34
35             // 引数有りの場合その値
36             node = new TreeNode<string>("test string");
37             Assert.AreEqual("test string", node.Value);
38         }
39
40         #endregion
41
42         #region プロパティテストケース
43
44         /// <summary>
45         /// Valueプロパティテストケース。
46         /// </summary>
47         [Test]
48         public void TestValue()
49         {
50             // 初期状態ではnull
51             TreeNode<string> node1 = new TreeNode<string>();
52             Assert.IsNull(node1.Value);
53
54             // 値を設定するとその値となる
55             node1.Value = "test string";
56             Assert.AreEqual("test string", node1.Value);
57
58             // 別の型でも同様
59             TreeNode<DateTime> node2 = new TreeNode<DateTime>();
60             node2.Value = new DateTime(100L);
61             Assert.AreEqual(new DateTime(100L), node2.Value);
62         }
63
64         /// <summary>
65         /// Parentプロパティテストケース。
66         /// </summary>
67         /// <remarks>値についての確認はAdd()メソッド等の試験で実施。</remarks>
68         [Test]
69         public void TestParent()
70         {
71             // 初期状態ではnull
72             TreeNode<string> node = new TreeNode<string>();
73             Assert.IsNull(node.Parent);
74         }
75
76         /// <summary>
77         /// Childrenプロパティテストケース。
78         /// </summary>
79         /// <remarks>値についての確認はAdd()メソッド等の試験で実施。</remarks>
80         [Test]
81         public void TestChildren()
82         {
83             // 初期状態では空のリスト
84             TreeNode<string> node = new TreeNode<string>();
85             Assert.IsNotNull(node.Children);
86             Assert.AreEqual(0, node.Children.Count);
87         }
88
89         #endregion
90
91         #region 公開メソッドテストケース
92
93         /// <summary>
94         /// Addメソッドテストケース正常系。
95         /// </summary>
96         [Test]
97         public void TestAdd()
98         {
99             // 子ノードを1件登録
100             TreeNode<string> parent = new TreeNode<string>("parent string");
101             TreeNode<string> child1 = new TreeNode<string>("child1 string");
102             parent.Add(child1);
103             Assert.IsNull(parent.Parent);
104             Assert.AreEqual(1, parent.Children.Count);
105             Assert.AreSame(parent, child1.Parent);
106             Assert.AreEqual(0, child1.Children.Count);
107             Assert.AreSame(child1, parent.Children[0]);
108
109             // 2件目を登録
110             TreeNode<string> child2 = new TreeNode<string>("child2 string");
111             parent.Add(child2);
112             Assert.AreEqual(2, parent.Children.Count);
113             Assert.AreSame(child1, parent.Children[0]);
114             Assert.AreSame(parent, child2.Parent);
115             Assert.AreEqual(0, child2.Children.Count);
116             Assert.AreSame(child2, parent.Children[1]);
117         }
118
119         /// <summary>
120         /// Addメソッドテストケース 自分を設定。
121         /// </summary>
122         [Test]
123         [ExpectedException(typeof(InvalidOperationException))]
124         public void TestAddThis()
125         {
126             TreeNode<string> parent = new TreeNode<string>("parent string");
127             TreeNode<string> child = new TreeNode<string>("child string");
128             parent.Add(child);
129             child.Add(parent);
130         }
131
132         /// <summary>
133         /// Addメソッドテストケース 親を設定。
134         /// </summary>
135         [Test]
136         [ExpectedException(typeof(InvalidOperationException))]
137         public void TestAddParent()
138         {
139             TreeNode<string> parent = new TreeNode<string>("parent string");
140             TreeNode<string> child = new TreeNode<string>("child string");
141             parent.Add(child);
142             child.Add(parent);
143         }
144
145         /// <summary>
146         /// Addメソッドテストケース 祖先を設定。
147         /// </summary>
148         [Test]
149         [ExpectedException(typeof(InvalidOperationException))]
150         public void TestAddGrandparent()
151         {
152             TreeNode<string> grandparent = new TreeNode<string>("grandparent string");
153             TreeNode<string> parent = new TreeNode<string>("parent string");
154             TreeNode<string> child = new TreeNode<string>("child string");
155             grandparent.Add(parent);
156             parent.Add(child);
157             child.Add(grandparent);
158         }
159
160         /// <summary>
161         /// Removeメソッドテストケース。
162         /// </summary>
163         [Test]
164         public void Remove()
165         {
166             // 子ノードを持つノードを作成
167             TreeNode<string> parent = new TreeNode<string>("parent string");
168             TreeNode<string> child1 = new TreeNode<string>("child1 string");
169             TreeNode<string> child2 = new TreeNode<string>("child2 string");
170             TreeNode<string> child3 = new TreeNode<string>("child3 string");
171             parent.Add(child1);
172             parent.Add(child2);
173             parent.Add(child3);
174             Assert.AreEqual(3, parent.Children.Count);
175             Assert.AreSame(parent, child1.Parent);
176             Assert.AreSame(child1, parent.Children[0]);
177
178             // 子ノードを1件削除
179             Assert.IsTrue(parent.Remove(child1));
180             Assert.IsNull(child1.Parent);
181             Assert.AreEqual(2, parent.Children.Count);
182             Assert.AreSame(child2, parent.Children[0]);
183
184             // 削除済みのノードを削除しようとするとfalse
185             Assert.IsFalse(parent.Remove(child1));
186             Assert.AreEqual(2, parent.Children.Count);
187
188             // 子ノード2件目を削除
189             Assert.IsTrue(parent.Remove(child3));
190             Assert.IsNull(child3.Parent);
191             Assert.AreEqual(1, parent.Children.Count);
192             Assert.AreSame(child2, parent.Children[0]);
193         }
194
195         /// <summary>
196         /// GetEnumeratorメソッドテストケース。
197         /// </summary>
198         [Test]
199         public void TestGetEnumerator()
200         {
201             // 親ノードのみ
202             TreeNode<string> parent = new TreeNode<string>("parent string");
203             this.AreSameIEnumerator<TreeNode<string>>(parent.GetEnumerator(), parent);
204
205             // 子ノードまで
206             TreeNode<string> child1 = new TreeNode<string>("child1 string");
207             TreeNode<string> child2 = new TreeNode<string>("child2 string");
208             parent.Add(child1);
209             parent.Add(child2);
210             this.AreSameIEnumerator<TreeNode<string>>(parent.GetEnumerator(), parent, child1, child2);
211
212             // 孫ノードまで
213             TreeNode<string> grandchild1 = new TreeNode<string>("grandchild1 string");
214             child1.Add(grandchild1);
215             this.AreSameIEnumerator<TreeNode<string>>(parent.GetEnumerator(), parent, child1, grandchild1, child2);
216         }
217
218         #endregion
219
220         #region テスト補助メソッド
221
222         /// <summary>
223         /// IEnumeratorが指定された値を返すかを検証する。
224         /// </summary>
225         /// <typeparam name="T">IEnumeratorが返す型。</typeparam>
226         /// <param name="actual">検証するIEnumerator。</param>
227         /// <param name="expected">期待値。</param>
228         /// <remarks>値の数も含めて検証する。不一致は試験失敗。</remarks>
229         private void AreSameIEnumerator<T>(IEnumerator<T> actual, params T[] expected)
230         {
231             foreach (T obj in expected)
232             {
233                 if (actual.MoveNext())
234                 {
235                     Assert.AreSame(obj, actual.Current);
236                 }
237                 else
238                 {
239                     Assert.Fail("actual < expected");
240                 }
241             }
242
243             if (actual.MoveNext())
244             {
245                 Assert.Fail("actual > expected");
246             }
247         }
248
249         #endregion
250     }
251 }