diff --git a/Promete.Test/NodeTests.cs b/Promete.Test/NodeTests.cs new file mode 100644 index 0000000..b0bee79 --- /dev/null +++ b/Promete.Test/NodeTests.cs @@ -0,0 +1,80 @@ +using FluentAssertions; +using Promete.Nodes; + +namespace Promete.Test; + +public class NodeTests +{ + [Fact] + public void AddSelfAsChild_ShouldThrowArgumentException() + { + // Arrange + var container = new Container(); + + // Act & Assert + var act = () => container.Add(container); + act.Should().Throw() + .WithMessage("*自分自身*"); + } + + [Fact] + public void InsertSelfAsChild_ShouldThrowArgumentException() + { + // Arrange + var container = new Container(); + + // Act & Assert + var act = () => container.Insert(0, container); + act.Should().Throw() + .WithMessage("*自分自身*"); + } + + [Fact] + public void AddDifferentNode_ShouldSucceed() + { + // Arrange + var container = new Container(); + var child = new Container(); + + // Act + container.Add(child); + + // Assert + container.Count.Should().Be(1); + child.Parent.Should().Be(container); + } + + [Fact] + public void InsertDifferentNode_ShouldSucceed() + { + // Arrange + var container = new Container(); + var child = new Container(); + + // Act + container.Insert(0, child); + + // Assert + container.Count.Should().Be(1); + child.Parent.Should().Be(container); + } + + [Fact] + public void InsertNodeWithExistingParent_ShouldMoveNode() + { + // Arrange + var oldParent = new Container(); + var newParent = new Container(); + var child = new Container(); + + oldParent.Add(child); + + // Act + newParent.Insert(0, child); + + // Assert + oldParent.Count.Should().Be(0); + newParent.Count.Should().Be(1); + child.Parent.Should().Be(newParent); + } +} diff --git a/Promete/Nodes/ContainableNode.cs b/Promete/Nodes/ContainableNode.cs index bd97d1d..77caa5d 100644 --- a/Promete/Nodes/ContainableNode.cs +++ b/Promete/Nodes/ContainableNode.cs @@ -70,6 +70,11 @@ protected void SortChildrenIfNeeded() protected void Add(Node node) { + if (node == this) + { + throw new ArgumentException("ノードの子要素に自分自身を追加することはできません。", nameof(node)); + } + node.Parent?.Remove(node); node.Parent = this; @@ -92,7 +97,12 @@ protected void Clear() protected void Insert(int index, Node node) { - node.Parent?.Remove(this); + if (node == this) + { + throw new ArgumentException("ノードの子要素に自分自身を追加することはできません。", nameof(node)); + } + + node.Parent?.Remove(node); children.Insert(index, node); node.Parent = this;