123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Masuit.Tools.Models;
- using Xunit;
- namespace Masuit.Tools.Abstractions.Test.Tree;
- public class TreeTest
- {
- [Fact]
- public void Can_BuildTree()
- {
- // arrange
- List<MyClass> list = new()
- {
- new MyClass
- {
- Name = "Root",
- Id = 1
- },
- new MyClass
- {
- Name = "Root",
- Id = 20000
- }
- };
- for (int i = 2; i < 1500; i++)
- {
- list.Add(new MyClass
- {
- Name = $"这是第{i}个子节点",
- Id = i,
- ParentId = i - 1
- });
- }
- for (int i = 20001; i < 40000; i++)
- {
- list.Add(new MyClass
- {
- Name = $"这是第{i}个子节点",
- Id = i,
- ParentId = i - 1
- });
- }
- // act
- List<MyClass> tree = list.ToTree();
- // assert
- Assert.Equal(tree[0].Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Id, 8);
- Assert.Equal(tree.Count, 2);
- Assert.Equal(tree[0].AllChildren().Count, 1498);
- List<MyClass> a = tree.Filter(c => c.Id == 39999).ToList();
- Assert.Equal(a[0].Id, 39999);
- List<MyClass> raw = tree.Flatten().ToList();
- Assert.Equal(raw.Count, list.Count);
- List<MyClass> allParent = a[0].AllParent();
- Assert.Equal(allParent[0].AllChildren().Count, 19999);
- Assert.Equal(a[0].Root(), list[1]);
- Assert.StartsWith("Root", a[0].Path());
- Assert.Equal(a[0].Level(), 20000);
- }
- [Fact]
- public void Can_BuildTree2()
- {
- // arrange
- List<MyClass2> list = new()
- {
- new MyClass2
- {
- Name = "Root",
- Id = "1"
- },
- new MyClass2
- {
- Name = "Root",
- Id = "20000"
- }
- };
- for (int i = 2; i < 1500; i++)
- {
- list.Add(new MyClass2
- {
- Name = $"这是第{i}个子节点",
- Id = i.ToString(),
- ParentId = (i - 1).ToString()
- });
- }
- for (int i = 20001; i < 40000; i++)
- {
- list.Add(new MyClass2
- {
- Name = $"这是第{i}个子节点",
- Id = i.ToString(),
- ParentId = (i - 1).ToString()
- });
- }
- // act
- List<MyClass2> tree = list.ToTree();
- // assert
- Assert.Equal(tree[0].Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Children.FirstOrDefault().Id, "8");
- Assert.Equal(tree.Count, 2);
- Assert.Equal(tree[0].AllChildren().Count, 1498);
- List<MyClass2> a = tree.Filter(c => c.Id == "39999").ToList();
- Assert.Equal(a[0].Id, "39999");
- List<MyClass2> raw = tree.Flatten().ToList();
- Assert.Equal(raw.Count, list.Count);
- List<MyClass2> allParent = a[0].AllParent();
- Assert.Equal(allParent[0].AllChildren().Count, 19999);
- Assert.Equal(a[0].Root(), list[1]);
- Assert.StartsWith("Root", a[0].Path());
- Assert.Equal(a[0].Level(), 20000);
- }
- [Fact]
- public void Can_BuildTree3()
- {
- // 0-1-3
- // -4-5
- // -2
- MyClass3 tree0 = new()
- {
- Id = 0,
- ParentId = -1,
- };
- MyClass3 tree1 = new()
- {
- Id = 1,
- ParentId = 0,
- };
- MyClass3 tree2 = new()
- {
- Id = 2,
- ParentId = 0,
- };
- MyClass3 tree3 = new()
- {
- Id = 3,
- ParentId = 1,
- };
- MyClass3 tree4 = new()
- {
- Id = 4,
- ParentId = 1,
- };
- MyClass3 tree5 = new()
- {
- Id = 5,
- ParentId = 4,
- };
- // 准备数据
- List<MyClass3> list = new() { tree0, tree1, tree2, tree3, tree4, tree5 };
- // 执行
- List<Tree<MyClass3>> nodes = list.ToTreeGeneral(c => c.Id, c => c.ParentId);
- var count = nodes.Flatten().Count();
- //验证
- Assert.NotNull(nodes);
- Assert.Equal(5, count); // 错误,返回的节点数为 2
- }
- }
- internal class MyClass : ITree<MyClass>, ITreeEntity<MyClass, int>
- {
- /// <summary>
- /// 父节点
- /// </summary>
- public MyClass Parent { get; set; }
- /// <summary>
- /// 子级
- /// </summary>
- public ICollection<MyClass> Children { get; set; }
- /// <summary>
- /// 名字
- /// </summary>
- public string Name { get; set; }
- /// <summary>
- /// 主键id
- /// </summary>
- public int Id { get; set; }
- /// <summary>
- /// 父级id
- /// </summary>
- public int? ParentId { get; set; }
- }
- internal class MyClass2 : ITree<MyClass2>, ITreeEntity<MyClass2>
- {
- /// <summary>
- /// 父节点
- /// </summary>
- public MyClass2 Parent { get; set; }
- /// <summary>
- /// 子级
- /// </summary>
- public ICollection<MyClass2> Children { get; set; }
- /// <summary>
- /// 名字
- /// </summary>
- public string Name { get; set; }
- /// <summary>
- /// 主键id
- /// </summary>
- public string Id { get; set; }
- /// <summary>
- /// 父级id
- /// </summary>
- public string ParentId { get; set; }
- }
- internal class MyClass3
- {
- public long Id { get; set; }
- public long ParentId { get; set; }
- }
|