Skip to content

Commit e4d6893

Browse files
committed
!3784 test: add TreeNodeCache unit test
* test: 增加 Reset 单元测试 * test: 增加 FindParentNode 单元测试 * fix: 修复不确定状态节点状态未重置问题 * test: 增加设置初始化状态逻辑单元测试 * refactor: 更新单元测试 * test: 增加内部数据检查 * test: 增加 ToggleCheck 单元测试 * test: 增加 TreeNodeCache 单元测试
1 parent 63b680b commit e4d6893

2 files changed

Lines changed: 311 additions & 0 deletions

File tree

src/BootstrapBlazor/Misc/TreeNodeCache.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ public void Reset()
190190
{
191191
uncheckedNodeCache.Clear();
192192
checkedNodeCache.Clear();
193+
indeterminateNodeCache.Clear();
193194
expandedNodeCache.Clear();
194195
collapsedNodeCache.Clear();
195196
}
Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
// Copyright (c) Argo Zhang (argo@163.com). All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
// Website: https://www.blazor.zone or https://argozhang.github.io/
4+
5+
using BootstrapBlazor.Shared;
6+
7+
namespace UnitTest.Misc;
8+
9+
public class TreeNodeCacheTest
10+
{
11+
[Fact]
12+
public void ToggleCheck_Ok()
13+
{
14+
var items = TreeFoo.GetTreeItems();
15+
var nodeCache = new TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo>(Comparer);
16+
nodeCache.IsChecked(items);
17+
18+
// 设置 1010 节点为选中状态
19+
var node = new TreeViewItem<TreeFoo>(new TreeFoo()
20+
{
21+
Id = "1010",
22+
Text = "Test"
23+
})
24+
{
25+
CheckedState = CheckboxState.Checked
26+
};
27+
nodeCache.ToggleCheck(node);
28+
29+
// 设置 1020 节点为未确定状态
30+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
31+
{
32+
Id = "1020",
33+
Text = "Test"
34+
})
35+
{
36+
CheckedState = CheckboxState.Indeterminate
37+
};
38+
nodeCache.ToggleCheck(node);
39+
40+
// 设置 1040 节点为未选中状态
41+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
42+
{
43+
Id = "1040",
44+
Text = "Test"
45+
})
46+
{
47+
CheckedState = CheckboxState.UnChecked
48+
};
49+
nodeCache.ToggleCheck(node);
50+
51+
// 设置 1100 子节点全部被选中
52+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
53+
{
54+
Id = "1130",
55+
Text = "Test"
56+
})
57+
{
58+
CheckedState = CheckboxState.Checked
59+
};
60+
nodeCache.ToggleCheck(node);
61+
62+
// 设置 1100 子节点全部被选中
63+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
64+
{
65+
Id = "1140",
66+
Text = "Test"
67+
})
68+
{
69+
CheckedState = CheckboxState.Checked
70+
};
71+
nodeCache.ToggleCheck(node);
72+
73+
// 设置 1100 子节点全部被选中
74+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
75+
{
76+
Id = "1150",
77+
Text = "Test"
78+
})
79+
{
80+
CheckedState = CheckboxState.Checked
81+
};
82+
nodeCache.ToggleCheck(node);
83+
84+
// 设置 1100 子节点选中
85+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
86+
{
87+
Id = "1100",
88+
Text = "Test"
89+
})
90+
{
91+
CheckedState = CheckboxState.Checked
92+
};
93+
nodeCache.ToggleCheck(node);
94+
95+
// 设置 1080 节点为选中状态
96+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
97+
{
98+
Id = "1080",
99+
Text = "Test"
100+
})
101+
{
102+
CheckedState = CheckboxState.Indeterminate
103+
};
104+
nodeCache.ToggleCheck(node);
105+
106+
// 设置 1050 节点为选中状态
107+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
108+
{
109+
Id = "1050",
110+
Text = "Test"
111+
})
112+
{
113+
CheckedState = CheckboxState.Indeterminate
114+
};
115+
nodeCache.ToggleCheck(node);
116+
117+
// 设置 1020 节点为选中状态
118+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
119+
{
120+
Id = "1020",
121+
Text = "Test"
122+
})
123+
{
124+
CheckedState = CheckboxState.Indeterminate
125+
};
126+
nodeCache.ToggleCheck(node);
127+
128+
var count = GetCheckItemCount(nodeCache);
129+
Assert.Equal(5, count);
130+
131+
count = GetUncheckItemCount(nodeCache);
132+
Assert.Equal(1, count);
133+
134+
count = GetIndeterminateItemCount(nodeCache);
135+
Assert.Equal(3, count);
136+
137+
// 开始测试
138+
// 设置 1030 节点为选中状态
139+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
140+
{
141+
Id = "1030",
142+
Text = "Test"
143+
})
144+
{
145+
CheckedState = CheckboxState.Checked
146+
};
147+
nodeCache.ToggleCheck(node);
148+
149+
// 设置 1030 节点为未选中状态
150+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
151+
{
152+
Id = "1030",
153+
Text = "Test"
154+
})
155+
{
156+
CheckedState = CheckboxState.UnChecked
157+
};
158+
nodeCache.ToggleCheck(node);
159+
160+
// 设置 1030 节点为选中状态
161+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
162+
{
163+
Id = "1030",
164+
Text = "Test"
165+
})
166+
{
167+
CheckedState = CheckboxState.Checked
168+
};
169+
nodeCache.ToggleCheck(node);
170+
171+
// 重给 Items
172+
items = TreeFoo.GetTreeItems();
173+
nodeCache.IsChecked(items);
174+
175+
// 检查结果
176+
var nodes = items.GetAllItems();
177+
var state = nodes.First(i => i.Value?.Id == "1010").CheckedState;
178+
Assert.Equal(CheckboxState.Checked, state);
179+
180+
state = nodes.First(i => i.Value?.Id == "1030").CheckedState;
181+
Assert.Equal(CheckboxState.Checked, state);
182+
183+
state = nodes.First(i => i.Value?.Id == "1020").CheckedState;
184+
Assert.Equal(CheckboxState.Indeterminate, state);
185+
186+
state = nodes.First(i => i.Value?.Id == "1050").CheckedState;
187+
Assert.Equal(CheckboxState.Indeterminate, state);
188+
189+
state = nodes.First(i => i.Value?.Id == "1080").CheckedState;
190+
Assert.Equal(CheckboxState.Indeterminate, state);
191+
192+
state = nodes.First(i => i.Value?.Id == "1100").CheckedState;
193+
Assert.Equal(CheckboxState.Checked, state);
194+
195+
state = nodes.First(i => i.Value?.Id == "1130").CheckedState;
196+
Assert.Equal(CheckboxState.Checked, state);
197+
198+
state = nodes.First(i => i.Value?.Id == "1130").CheckedState;
199+
Assert.Equal(CheckboxState.Checked, state);
200+
201+
state = nodes.First(i => i.Value?.Id == "1130").CheckedState;
202+
Assert.Equal(CheckboxState.Checked, state);
203+
}
204+
205+
[Fact]
206+
public void FindParentNode_Ok()
207+
{
208+
var items = TreeFoo.GetTreeItems();
209+
var nodeCache = new TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo>(Comparer);
210+
var targetId = nodeCache.FindParentNode(items, new TreeViewItem<TreeFoo>(new TreeFoo() { Id = "1110" }))?.Value?.Id;
211+
Assert.Equal("1080", targetId);
212+
}
213+
214+
[Fact]
215+
public void Reset_Ok()
216+
{
217+
var items = TreeFoo.GetTreeItems();
218+
var nodeCache = new TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo>(Comparer);
219+
220+
// 设置 1070 节点为选中状态
221+
var node = new TreeViewItem<TreeFoo>(new TreeFoo()
222+
{
223+
Id = "1070",
224+
Text = "Test"
225+
})
226+
{
227+
CheckedState = CheckboxState.Checked
228+
};
229+
nodeCache.ToggleCheck(node);
230+
231+
// 设置 1080 节点为选中状态
232+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
233+
{
234+
Id = "1080",
235+
Text = "Test"
236+
})
237+
{
238+
CheckedState = CheckboxState.Indeterminate
239+
};
240+
nodeCache.ToggleCheck(node);
241+
242+
// 设置 1090 节点为选中状态
243+
node = new TreeViewItem<TreeFoo>(new TreeFoo()
244+
{
245+
Id = "1090",
246+
Text = "Test"
247+
})
248+
{
249+
CheckedState = CheckboxState.UnChecked
250+
};
251+
nodeCache.ToggleCheck(node);
252+
253+
var count = GetCheckItemCount(nodeCache);
254+
Assert.Equal(1, count);
255+
256+
count = GetUncheckItemCount(nodeCache);
257+
Assert.Equal(1, count);
258+
259+
count = GetIndeterminateItemCount(nodeCache);
260+
Assert.Equal(1, count);
261+
262+
nodeCache.Reset();
263+
count = GetCheckItemCount(nodeCache);
264+
Assert.Equal(0, count);
265+
266+
count = GetUncheckItemCount(nodeCache);
267+
Assert.Equal(0, count);
268+
269+
count = GetIndeterminateItemCount(nodeCache);
270+
Assert.Equal(0, count);
271+
}
272+
273+
private bool Comparer(TreeFoo x, TreeFoo y) => x.Id == y.Id;
274+
275+
private static int GetCheckItemCount(TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo> treeNodeCache)
276+
{
277+
var count = 0;
278+
var type = treeNodeCache.GetType();
279+
var fieldInfo = type.GetField("checkedNodeCache", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
280+
if (fieldInfo != null && fieldInfo.GetValue(treeNodeCache) is List<TreeFoo> data)
281+
{
282+
count = data.Count;
283+
}
284+
return count;
285+
}
286+
287+
private static int GetUncheckItemCount(TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo> treeNodeCache)
288+
{
289+
var count = 0;
290+
var type = treeNodeCache.GetType();
291+
var fieldInfo = type.GetField("uncheckedNodeCache", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
292+
if (fieldInfo != null && fieldInfo.GetValue(treeNodeCache) is List<TreeFoo> data)
293+
{
294+
count = data.Count;
295+
}
296+
return count;
297+
}
298+
299+
private static int GetIndeterminateItemCount(TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo> treeNodeCache)
300+
{
301+
var count = 0;
302+
var type = treeNodeCache.GetType();
303+
var fieldInfo = type.GetField("indeterminateNodeCache", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
304+
if (fieldInfo != null && fieldInfo.GetValue(treeNodeCache) is List<TreeFoo> data)
305+
{
306+
count = data.Count;
307+
}
308+
return count;
309+
}
310+
}

0 commit comments

Comments
 (0)